package Reproductor;

import java.awt.Component;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import javax.media.CannotRealizeException;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.Player;
import javax.media.RealizeCompleteEvent;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

import Ventanas.VentanaReproductorMusica;

/**
 * @author Grupo 04 Reproductor MP3 que se encarga de reproducir las canciones
 *         MP3. Para eso usa JMF con un plugin extra para poder reproducir los
 *         MP3 sin problemas.
 */
public class ReproductorMP3 implements ControllerListener {
	private URL url;
	private MediaLocator mediaLocator;
	private Player playMP3;
	private VentanaReproductorMusica ventana;

	/**
	 * El constructor que solo necesita la ventana del reproductor.
	 * 
	 * @param ventanap
	 */
	public ReproductorMP3(VentanaReproductorMusica ventanap) {
		ventana = ventanap;

	}

	/**
	 * Empieza a reproducir teniendo un path de una cancion
	 * 
	 * @param path
	 */
	public void reproducir(String path) {
		try {
			// Creo un file para conseguir el URL luego
			File cancion = new File(path);
			// Deprecated pero no veia otra manera
			this.url = cancion.toURL();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// }

		try {
			mediaLocator = new MediaLocator(url);
			try {
				playMP3 = Manager.createRealizedPlayer(url);
			} catch (CannotRealizeException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} catch (java.io.IOException e) {
			System.out.println(e.getMessage());
		} catch (javax.media.NoPlayerException e2) {
			System.out.println(e2.getMessage());
		}

		playMP3.realize();
		// Listener para cuando este el player realizado devuelva el panel
		// Para cuando termine la cancion haga algo
		playMP3.addControllerListener(this);
	}

	/**
	 * Para la cancion que se este reproduciendo, corta el hilo.
	 */
	public void pararAnterior() {
		if (playMP3 != null) {
			playMP3.stop();
			playMP3.close();
			JPanel panelInf = ventana.getPanelInferior();
			panelInf.removeAll();

		}
	}

	@Override
	public void controllerUpdate(ControllerEvent e) {
		if (e instanceof RealizeCompleteEvent) {
			Component controlsComponent = playMP3.getControlPanelComponent();

			if (controlsComponent != null) {

				JPanel a = new JPanel();

				JPanel b = ventana.getPanelInferior();
				// BoxLayout para que aparezca la barra entera del tiempo
				a.setLayout(new BoxLayout(a, BoxLayout.Y_AXIS));
				b.setLayout(new BoxLayout(b, BoxLayout.Y_AXIS));
				b.add(a);
				a.add(controlsComponent);
				a.add(new JPanel().add(new JLabel()));
				b.setSize(50, 50);

				playMP3.start();
				b.add(a, "South");
				ventana.pack();
				ventana.setSize(650, 300);

			}

		} else {
			if (e instanceof EndOfMediaEvent) {
				playMP3.stop();
				playMP3.close();
				JPanel panelInf = ventana.getPanelInferior();
				panelInf.removeAll();
				ventana.siguienteCancion();
			}
		}

	}

	public void cerrar() {
		if (playMP3 != null) {
			playMP3.deallocate();
		}
	}
}
